﻿// Decompiled with JetBrains decompiler
// Type: Microsoft.InfoCards.DeleteCardRequest
// Assembly: infocard, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// MVID: 8E14765A-6610-409A-BA36-099A0642905D
// Assembly location: E:\git\ALLIDA\windll\infocard.exe

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace Microsoft.InfoCards
{
  internal class DeleteCardRequest : UIAgentRequest
  {
    private Uri m_cardId;

    public DeleteCardRequest(
      IntPtr rpcHandle,
      Stream inArgs,
      Stream outArgs,
      ClientUIRequest parent)
      : base(rpcHandle, inArgs, outArgs, parent)
    {
    }

    protected override void OnInitializeAsSystem()
    {
      base.OnInitializeAsSystem();
    }

    protected override void OnMarshalInArgs()
    {
      this.m_cardId = Utility.DeserializeUri((BinaryReader) new InfoCardBinaryReader(this.InArgs, Encoding.Unicode));
    }

    protected override void OnProcess()
    {
      StoreConnection connection = StoreConnection.GetConnection();
      try
      {
        connection.BeginTransaction();
        try
        {
          DataRow singleRow = connection.GetSingleRow(QueryDetails.FullRow, new QueryParameter("ix_globalid", new object[1]
          {
            (object) GlobalId.DeriveFrom(this.m_cardId.ToString())
          }));
          if (singleRow != null)
          {
            byte[] dataField = singleRow.GetDataField();
            try
            {
              using (MemoryStream memoryStream = new MemoryStream(dataField))
              {
                string name = new InfoCard((Stream) memoryStream).Name;
              }
            }
            finally
            {
              connection.Delete(singleRow);
              Array.Clear((Array) dataField, 0, dataField.Length);
            }
          }
          ICollection collection = (ICollection) connection.Query(QueryDetails.Identifiers, new List<QueryParameter>()
          {
            new QueryParameter("ix_parentid", new object[1]
            {
              (object) GlobalId.DeriveFrom(this.m_cardId.ToString())
            })
          }.ToArray());
          if (collection != null && collection.Count > 0)
          {
            foreach (DataRow row in (IEnumerable) collection)
              connection.Delete(row);
          }
          connection.CommitTransaction();
          AuditLog.AuditCardDeletion();
        }
        catch
        {
          connection.RollbackTransaction();
          throw;
        }
      }
      finally
      {
        connection.Close();
      }
    }

    protected override void OnMarshalOutArgs()
    {
    }
  }
}
